package org.zjt.book

/**
  * DESC    私有属性的访问，并提供默认值。
  * ps:  构造对象后，执行class中的所有的语句
  * Class (val 变量)才能被外部访问
  *     坑：
  *         1、case class 创建类不能被继承。（不能被继承）.自动提供var属性的访问权限。
  *         2、class 主构造器，不能声明var。var是私有变量。val是共有变量。       class 主构造器不能修改属性   （不能被修改属性）
  *         3、class中属性：和java传统类相似。                    （java相似）
  *
  * @author
  * @create 2017-04-26 上午10:23
  **/
class ClassTest(private var value: Int = 0) {
  println("构造对象后执行的语句")

  def increment = value += 1

  def getValue = value

}


// 1、 Class (val 变量)才能被外部访问
class A(val name: String)

class B(val age: Int, override val name: String) extends A(name)


// 2、创建可修改的属性值的对象
class C {
  var name: String = _
}

class D extends C {
  var age: Int = _
}


/*
    case class 不能被编译

// 3、 不可修改属性的case class变量
case class E(val name: String)

case class F( val name2: String, age: Int) extends E(name2)


// 4、 不可修改属性的case class变量
case class G(val name: String)

case class H(override val name: String, age: Int) extends E(name)


*/


case class E(var name: String)


object Start extends App {

  val b = new B(12, "zhang")
  println(b.age)

  val d = new D()
  d.age = 12
  d.name = "zhangsan"
  println(d)


  var e = new E("ssss")
  e.name = "wangwu"
  println(e.name)



  /*var h = new H("zhangsan", 12)
  println(h.age)

  var f = new F("zhangsan", 12)
  println(f.name)*/

  var increment = new ClassTest(0)
  increment.increment
  println(increment.getValue)

}
